home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MYUTIL / RSCPATCH.M < prev    next >
Encoding:
Text File  |  1991-02-10  |  8.1 KB  |  308 lines

  1. MODULE RSCPatch;
  2.  
  3. (*
  4.  * Erstellt mit Megamax Modula-2 Version 2.2
  5.  *
  6.  *)
  7.  
  8. (*$M- No symbols (procedure names) *)
  9. (*$L- No procedure entry code *)
  10. (*$N+ No runtime module needed *)
  11.  
  12. FROM SYSTEM IMPORT ASSEMBLER, ADDRESS, BYTE, WORD;
  13.  
  14.  
  15. CONST SFOfs = 2;  (* = 2, wenn CPU mit Stackframe verwendet wird! *)
  16.  
  17.       GemRscPtr = $7002;      (* aes' ptr to rsc buffer *)
  18.  
  19. TYPE  FileHeader = RECORD
  20.         ident: ARRAY [0..15] OF CHAR; (* "MM2/RscPatch"+CR+LF+EOF *)
  21.         version: BYTE;     (* = 1 *)
  22.         revision: BYTE;    (* = 0 *)
  23.         rscOffs: LONGCARD; (* = 36 *)
  24.         reserved: ARRAY [1..3] OF LONGCARD;
  25.         conf: WORD;
  26.       END;
  27.  
  28.  
  29. CONST (* GEMDOS functions *)
  30.       PtermRes  = $31;
  31.       PrintLine = $09;
  32.       Fopen     = $3D;
  33.       Fclose    = $3E;
  34.       Fseek     = $42;
  35.       Fread     = $3F;
  36.  
  37.       (* XBIOS functions *)
  38.       Supexec   = $26;
  39.  
  40.       (* base page constants *)
  41.       codestart = 8;
  42.       codelen   = 12;
  43.       datastart = 16;
  44.       datalen   = 20;
  45.       bssstart  = 24;
  46.       bsslen    = 28;
  47.       parent    = 36;
  48.  
  49. VAR   tosHeader: ARRAY [1..$18] OF WORD; (* Kopie des TOS-Headers *)
  50.       bufAddr: ADDRESS;
  51.       bufSize: LONGCARD;
  52.  
  53.  
  54. PROCEDURE hdlGemdos;
  55.   BEGIN
  56.     ASSEMBLER
  57.         ASC     "XBRA"
  58.         ASC     "RscP"
  59. prev:   DC.L    0
  60.  
  61.         ; Entry point
  62. entry:  BTST    #5,(A7)         ; call from supervisor mode?
  63.         BNE     y1
  64.  
  65. dos:    MOVE.L  prev(PC),A0
  66.         JMP     (A0)            ; jump to original GEMDOS handler
  67.  
  68. y1:     CMPI.W  #$48,SFOfs+6(A7) ; Malloc() function call?
  69.         BNE     dos
  70.         MOVE.L  $4F2,A0
  71.         ADDA.L  #$18000,A0
  72.         CMPA.L  2(A7),A0        ; call from AES malloc handler?
  73.         BCC     dos
  74.         MOVE.L  2(A7),A0
  75.         CMPA.L  SFOfs+12(A7),A0 ; call from AES RSC installation routine?
  76.         BCC     dos
  77.  
  78.         ; this is the Malloc call we waited for!
  79.  
  80.         MOVE.L  bufAddr,GemRscPtr
  81.         MOVE.L  SFOfs+12(A7),A0 ; load return address
  82.      s: CMPI.W  #$508F,(A0)+    ; search for "ADDQ.L #8,A7"
  83.         BNE     s
  84.         MOVE.L  A0,SFOfs+12(A7) ; set new return address
  85.  
  86.         ; remove this GEMDOS handler
  87.         MOVE.L  A2,-(A7)        ; just for safety
  88.         LEA     entry(PC),A2
  89.         LEA     $84,A0          ; TRAP #1 vector
  90.      l: MOVE.L  (A0),A1
  91.         CMPA.L  A2,A1           ; entry found?
  92.         BEQ     f
  93.         CMPI.L  #$58425241,-12(A1) ; is this an XBRA entry?
  94.         BNE     n               ; no -> don't remove our entry
  95.         LEA     -4(A1),A0       ; take previous vector
  96.         BRA     l
  97.      f: MOVE.L  -4(A1),(A0)     ; insert previous vector
  98.         MOVE.L  (A7)+,A2
  99.      n:
  100.         RTE
  101.     END
  102.   END hdlGemdos;
  103.  
  104. PROCEDURE cpuTest;
  105.   BEGIN
  106.     ASSEMBLER
  107.         MOVE.L  A7,D2
  108.         LEA     $10,A1          ; illegal instruction exc-vector
  109.         MOVE.L  (A1),D1
  110.         LEA     b(PC),A0
  111.         MOVE.L  A0,(A1)
  112.         MOVE.L  #68000,D0
  113.         DC.W    $51FC           ;TRAPF
  114.         MOVE.L  D1,(A1)
  115.         MOVE.L  #68020,D0
  116.         DC.W    $4E7A,$1002     ;MOVEC   CACR,D1
  117.         MOVE.L  D1,D2
  118.         ORI.W   #100100000000%,D2 ; clear & enable data cache
  119.         DC.W    $4E7B,$2002     ;MOVEC   D2,CACR
  120.         DC.W    $4E7A,$2002     ;MOVEC   CACR,D2
  121.         BTST    #8,D2           ; data cache enabled?
  122.         BEQ     e
  123.         MOVE.L  #68030,D0
  124.       e DC.W    $4E7B,$1002     ;MOVEC   D1,CACR
  125.         RTS
  126.       b MOVE.L  D2,A7
  127.         MOVE.L  D1,(A1)
  128.     END
  129.   END cpuTest;
  130.  
  131. BEGIN
  132.   ASSEMBLER
  133.         PEA     cpuTest
  134.         MOVE    #Supexec,-(A7)
  135.         TRAP    #14
  136.         ADDQ.L  #6,A7
  137.         CMPI.L  #68030,D0
  138.         BNE.W   noInstall
  139.  
  140.         MOVE.L  4(A7),A5        ; starting address of workspace
  141.         
  142.         ; ** load RSC-File **
  143.         ; open file
  144.         CLR.W   -(A7)           ; read only
  145.         PEA     fname(PC)
  146.         MOVE.W  #Fopen,-(A7)
  147.         TRAP    #1
  148.         ADDQ.L  #8,A7
  149.         TST.W   D0
  150.         BMI.W   nofile          ; error on open -> abort installation
  151.         MOVE    D0,D3           ; D3: file handle
  152.         ; Fseek to end of file in order to get file size
  153.         MOVE.W  #2,-(A7)
  154.         MOVE.W  D3,-(A7)
  155.         CLR.L   -(A7)
  156.         MOVE.W  #Fseek,-(A7)
  157.         TRAP    #1
  158.         ADDA.W  #10,A7
  159.         MOVE.L  D0,D4           ; D4: file size
  160.         BMI.W   readerr
  161.         ; back to begin of file
  162.         MOVE.W  #0,-(A7)
  163.         MOVE.W  D3,-(A7)
  164.         CLR.L   -(A7)
  165.         MOVE.W  #Fseek,-(A7)
  166.         TRAP    #1
  167.         ADDA.W  #10,A7
  168.         ; load RSC to begin of heap (end of static prog space)
  169.         MOVE.L  A5,A4           ; start of prg space
  170.         ADDA.L  codelen(A5),A4
  171.         ADDA.L  datalen(A5),A4
  172.         ADDA.L  bsslen(A5),A4
  173.         ADDA.W  #256,A4         ; add size of base page
  174.         MOVE.L  A4,-(A7)        ; A4: begin of RSC buffer
  175.         MOVE.L  D4,-(A7)
  176.         MOVE.W  D3,-(A7)
  177.         MOVE    #Fread,-(A7)
  178.         TRAP    #1
  179.         ADDA.W  #12,A7
  180.         TST.L   D0
  181.         BMI.W   readerr
  182.         ; close file
  183.         MOVE.W  D3,-(A7)
  184.         MOVE.W  #Fclose,-(A7)
  185.         TRAP    #1
  186.         ADDQ.L  #4,A7
  187.         
  188.         ; verify data in file
  189.         MOVE.L  A4,A0
  190.         CMPI.L  #$4D4D322F,(A0)+
  191.         BNE.W   wrongFile
  192.         CMPI.L  #$52736350,(A0)+
  193.         BNE.W   wrongFile
  194.         CMPI.L  #$61746368,(A0)+
  195.         BNE.W   wrongFile
  196.         CMPI.B  #1,FileHeader.version(A4)
  197.         BNE.W   wrongVersion
  198.         
  199.         ; copy TOS-header from ROM to RAM
  200.         PEA     t(PC)
  201.         MOVE    #Supexec,-(A7)
  202.         TRAP    #14
  203.         ADDQ.L  #6,A7
  204.         BRA     c
  205.      t: MOVE.L  $4F2,A0
  206.         LEA     tosHeader,A1
  207.         MOVE.L  A1,D0
  208.         MOVEQ   #$17,D1
  209.      l: MOVE.W  (A0)+,(A1)+
  210.         DBRA    D1,l
  211.         MOVE.L  D0,$4F2
  212.         RTS
  213.      c: MOVE.L  D0,A0           ; A0: ^TOS-header
  214.  
  215.         ; set config word in TOS-header
  216.         MOVE.W  FileHeader.conf(A4),$1C(A0)
  217.         
  218.         ; install GEMDOS handler
  219.         PEA     t2(PC)
  220.         MOVE    #Supexec,-(A7)
  221.         TRAP    #14
  222.         ADDQ.L  #6,A7
  223.         BRA     c2
  224.     t2: LEA     hdlGemdos,A0
  225.         ADDA.W  #12,A0
  226.         LEA     $84,A1          ; TRAP #1 vector
  227.         MOVE.L  (A1),-4(A0)
  228.         MOVE.L  A0,(A1)
  229.         RTS
  230.     c2:
  231.         ; store arguments for 'hdlGemdos'
  232.         ADDA.L  FileHeader.rscOffs(A4),A4
  233.         MOVE.L  A4,bufAddr
  234.         MOVE.L  D4,bufSize
  235.  
  236.         ; print install msg
  237.         PEA     msg_1(PC)
  238.         MOVE.W  #PrintLine,-(A7)
  239.         TRAP    #1
  240.         ADDQ.L  #6,A7
  241.  
  242.         ; terminate program
  243.         MOVE.L  codelen(A5),D0
  244.         ADD.L   datalen(A5),D0
  245.         ADD.L   bsslen(A5),D0
  246.         ADDI.L  #256,D0         ; add length of base page
  247.         ADD.L   D4,D0           ; add space for RSC buffer
  248.         CLR.W   -(A7)           ; exitCode
  249.         MOVE.L  D0,-(A7)        ; amount
  250.         MOVE.W  #PtermRes,-(A7) ; terminate and stay resident
  251.         TRAP    #1
  252.         BREAK
  253.  
  254. readerr ; close file
  255.         MOVE.W  D3,-(A7)
  256.         MOVE.W  #Fclose,-(A7)
  257.         TRAP    #1
  258.         ADDQ.L  #4,A7
  259.         ; print read error msg
  260.         PEA     msg_3(PC)
  261.         BRA     msgout
  262.  
  263. noInstall:
  264.         BRA     exit
  265.  
  266. wrongFile:
  267.         PEA     msg_4(PC)
  268.         BRA     msgout
  269.  
  270. wrongVersion:
  271.         PEA     msg_5(PC)
  272.         BRA     msgout
  273.  
  274. nofile: ; print open error msg
  275.         PEA     msg_2(PC)
  276.  
  277. msgout: MOVE.W  #PrintLine,-(A7)
  278.         TRAP    #1
  279.         ADDQ.L  #6,A7
  280. exit:   CLR.W   -(A7)
  281.         TRAP    #1              ; terminate
  282.  
  283.  
  284. fname   ACZ     "\DESKTOP.DAT"
  285.  
  286. msg_1   DC.B    13,10
  287.         ASC     "RSC-Patch installed"
  288.         DC.B    13,10,0
  289.  
  290. msg_2   DC.B    13,10
  291.         ASC     "RSC-Patch: resource file DESKTOP.DAT not found!"
  292.         DC.B    13,10,0
  293.  
  294. msg_3   DC.B    13,10
  295.         ASC     "RSC-Patch: read error on resource file!"
  296.         DC.B    13,10,0
  297.  
  298. msg_4   DC.B    13,10
  299.         ASC     "RSC-Patch: DESKTOP.DAT does not contain resource data!"
  300.         DC.B    13,10,0
  301.  
  302. msg_5   DC.B    13,10
  303.         ASC     "RSC-Patch: incompatible version of DESKTOP.DAT!"
  304.         DC.B    13,10,0
  305.         SYNC
  306.   END
  307. END RSCPatch.
  308.